[기능구현#4] 예외처리
실행 환경
같은 폴더의 “[리팩터링] 게시판 프로젝트 아키텍처” 노트에 명시된 스택 기준 — Spring Boot 3.3.5, Java 17, H2 Database, Thymeleaf.
예외처리 흐름도
[Client] → [Controller] → Exception 발생
│
▼
[Tomcat]
│
에러 코드별 지정된 Mapping
│
▼
[Controller] (에러 페이지용)
│
▼
[View] 응답- 기본적인 Exception 흐름도
- Controller에서 Exception 발생
- Tomcat으로 전달
- 에러 코드 별로, 지정된 Mapping으로 다시 Controller로 전달
- 전달된 페이지를 View
예외처리 방법
- Exception을 직접 구현하여, mapping Controller로 진행
- Spring이 자동으로, 에러코드별 html이 있다면 해당 html로 view 진행
- API형식일 경우, json 형태로 (혹은 다른 방식으로) 에러 코드 및 메시지 전달
- 현재 프로젝트에 적용되어 있는 Exception 방식
- 1번 방법으로, Exception을 직접 구현하여 원하는 Html로 맵핑 작업
예외처리 구현
- WebServerFactoryCustomizer를 통한 구현 (@Override customize())
- /errors/custom 하위에 에러코드에 맞는 페이지 구현
@Component
public class CustomExceptionPage implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
@Override
public void customize(ConfigurableWebServerFactory factory) {
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/errors/custom/404");
ErrorPage errorPage502 = new ErrorPage(HttpStatus.BAD_GATEWAY, "/errors/custom/502");
ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/errors/custom/500");
ErrorPage errorPageEx500 = new ErrorPage(RuntimeException.class, "/errors/custom/500");
factory.addErrorPages(errorPage404,errorPage500, errorPage502, errorPageEx500);
}
}- Controller 구현
@Controller
@RequestMapping(value="/errors/custom")
@Slf4j
public class ExceptionPageController {
@GetMapping("500")
public String error500(HttpServletRequest request, HttpServletResponse response){
return "errors/custom/500";
}
@GetMapping("502")
public String error502(HttpServletRequest request, HttpServletResponse response){
return "errors/custom/502";
}
@GetMapping("404")
public String error404(HttpServletRequest request, HttpServletResponse response){
return "errors/custom/404";
}
}참고)
-
spring 으로 Exception을 처리할경우 “/template/errors” 하위에 5xx.html 같이 만들어 두면 spring이 해당 에러코드가 나올시 자동으로 맵핑해줌
-
API의 경우, 직접 정의하여 Exception처리를 진행해야함 (코드값 , msg) -> AOP를 사용하면 편리해보임
아쉬운점
- Error에 대한 핸들링을 해보지못하고, 단순 에러처리 페이지에 대한 처리만 해놓은 것이 아쉽다.
- Exception에 대한 처리를 Exception을 만들어서 핸들링하고 어떤 에러가 나왔는지 로그를 기록해야하는데 이 부분을 자세히 로직을 생각하지 못한 부분이 아쉽다.
관련 문서
- (학습/프로젝트/토이프로젝트/게시판 프로젝트) [리팩터링] 개발 요구사항 (게시판 프로젝트) — 개발 요구사항 문서에 명시된 예외처리 기능을 구현
- (학습/프레임워크/Spring Framework) 예외처리 (web page) — WebServerFactoryCustomizer와 ErrorPage를 이용한 예외처리 방식이 다루는 것과 동일한 주제의 강의 노트
- (학습/프레임워크/Spring Framework/실습_스프링MVC/예외처리와 오류 페이지) 예외처리와 오류 페이지 — WebServerFactoryCustomizer/ErrorPage 기반 예외처리 패턴이 거의 동일한 강의 노트